/**
 * @author 吴宇亮
 * @describe 用于初始化from表单一些常用的功能
 * @date 2018-12-19
 */

/**
 * 渲染单选、多选下拉框
 * @param jsonSetting
 * { <br/>
 * 	   form: 必填，form组件 或 formSelects组件, <br/>
 *     selector: 必填，生成选项的选择器, <br/>
 *     dataList: 必填，选项数据项，如：如：[{"lid":5,"clid":8,"k":"0","v":"否","remark":""},{"lid":6,"clid":8,"k":"1","v":"是","remark":""}], <br/>
 *     key: 默认为k, <br/>
 *     value: 默认为v, <br/>
 *     defaultKey: 默认选中key为defaultKey的选项，优先级比defaultValue高, <br/>
 *     defaultValue: 默认选中value为defaultValue的选项, <br/>
 * }
 */
function _initSingleSelectItem(jsonSetting){
	if(!jsonSetting) return;
	let form = jsonSetting.form
		,selector = jsonSetting.selector
		,dataList = jsonSetting.dataList;
	if(!form || !selector || !dataList){
		return;
	}

	let key = jsonSetting.key || "k"
		,value = jsonSetting.value || "v"

    let html = `<option value="">请选择</option>`;
	for(let item of dataList){
		if(jsonSetting.defaultKey && jsonSetting.defaultKey == item[key]){
            html += `<option value="${item[key]}" selected="">${item[value]}</option>`;
		}else if(jsonSetting.defaultValue && jsonSetting.defaultValue == item[value]){
            html += `<option value="${item[key]}" selected="">${item[value]}</option>`;
		}else{
            html += `<option value="${item[key]}">${item[value]}</option>`;
		}
	}
	$(selector).html(html);
    form.render("select");
}

/**
 * 渲染radio单选按钮的选项
 * @param form form组件
 * @param selector radio选择器
 * @param codesetDetailList 选项List, 如：[{"lid":5,"clid":8,"k":"0","v":"否","remark":""},{"lid":6,"clid":8,"k":"1","v":"是","remark":""}]
 * @param name
 * @param defaultValue 默认选中的值
 */
//TODO 这个改成配置式
function _initRadioItem(form, selector, codesetDetailList, name, defaultKey, isDisable){
    isDisable = isDisable || false;
    name = name ? `name=${name}` : ``;

	let html = "";
	for(let item of codesetDetailList){
		html += `<input type="radio" ${name} value="${item.k}" title="${item.v}" ${item.k == defaultKey ? 'checked=""' : ''} ${isDisable ? 'disabled=""' : ''} >`;
	}
	$(selector).html(html);
    form.render("radio");
}

function _initCheckboxItem(codesetDetailList){
    for(let item of codesetDetailList){

    }
}

/**
 * 阻止按钮重复提交
 */
function stopCommitRepeat(){
	if($(".layui-layer-btn0").hasClass("hasCommit")){
		layer.msg("不能重复提交哦！");
	}else{
		$(".layui-layer-btn0").addClass("hasCommit");
	}
}


$(function(){
	//自动渲染placeholder和autocomplete；还有给提示渲染成类型lay-verType="tips"
    $(".layui-form").find(".layui-form-label").each(function(){
        let that = $(this);
        let nextBrotherElement = that.next();
        if(!nextBrotherElement){
            return true; //continue
        }

        //只自动渲染input、textarea标签
        let autoLabel = ["input", "textarea"];
		let inputElement;
        for(let label of autoLabel) {
            inputElement = nextBrotherElement.find(label);
            if(inputElement.length != 0){
            	break;
			}
        }
		if(inputElement.length == 0){
            return true; //continue
        }

		//如果为以下则不用渲染
		let type = inputElement.attr("type");
		if(type && ["hidden", "checkbox", "radio"].includes(type)) {
            return true; //continue
        }
		//如果为只读, 则不进行渲染
		if(inputElement.attr("readonly") || inputElement.attr("disabled")) {
            return true; //continue
		}

		if(!inputElement.attr("placeholder")) {
			let text = that.html();
			if(!text) {
                return true; //continue
            }
            let span = '<span style="color:red">*</span>';
            if (text.indexOf(span) != -1) {
                text = text.substring(text.indexOf(span) + span.length);
            }
			inputElement.attr("placeholder", `请输入${text}`);
		}

		//自动渲染提示为吸附层
		if(inputElement.attr("lay-verify")){
            inputElement.attr("lay-verType", "tips");
		}
        inputElement.attr("autocomplete", "off");
    })

	//初始化form表单上的<input type="text"/>回车跳到下一个格子上的功能（即实现tab按键的功能），当最后一个格子继续按回车的时候，会触发提交
	$("#bofrom .layui-inline").find(":text").keypress(function(e) {
	    if (e.which == 13) {// 判断所按是否回车键
	      let inputs = $(".layui-form .layui-inline").find(":text"); // 获取表单中的所有输入框  
            	let idx = inputs.index(this); // 获取当前焦点输入框所处的位置  

	      if (idx == inputs.length - 1) {// 判断是否是最后一个输入框
					layer.confirm('最后一个输入框已经输入,是否提交?',{
						btn:['确认','取消'],
						icon: 3,
						title:'提示',
						success:function(){//弹出层初始化完毕的回调
							this.enterEsc = function (event) {
								if (event.keyCode === 13) { //13-回车键
									$(".layui-layer-btn0").click();
									return false; //阻止系统默认回车事件
								}else if(event.keyCode == 27){ //27-ESC键
									$(".layui-layer-btn1").click();
									return false;
								}
							};
							$(document).on('keydown', this.enterEsc); //监听键盘事件，关闭层
						},
						end:function(){
							$(document).off('keydown',this.enterEsc); //解除键盘关闭事件
						}
					},
					function (index) {//点击确定后执行的方法体
						$(".form-submit-btn").click();
						layer.close(index);    //执行完后关闭
					});
        } else {
          inputs[idx + 1].focus(); // 设置焦点  
          inputs[idx + 1].select(); // 选中文字
        }
        return false;// 取消默认的提交行为
	    }
	});
	
	//初始化layui的table单击行勾选checkbox功能，参考博客：https://blog.csdn.net/damosk/article/details/79609272
	$(document).on("click",".layui-table-body table.layui-table tbody tr", function () {
	    var index = $(this).attr('data-index');
	    var tableBox = $(this).parents('.layui-table-box');
	    //存在固定列
	    if (tableBox.find(".layui-table-fixed.layui-table-fixed-l").length > 0) {
	        tableDiv = tableBox.find(".layui-table-fixed.layui-table-fixed-l");
	    } else {
	        tableDiv = tableBox.find(".layui-table-body.layui-table-main");
	    }
	    var checkCell = tableDiv.find("tr[data-index=" + index + "]").find("td div.laytable-cell-checkbox div.layui-form-checkbox I");
	    if (checkCell.length > 0) {
	        checkCell.click();
	    }
	});
	$(document).on("click", "td div.laytable-cell-checkbox div.layui-form-checkbox", function (e) {
	    e.stopPropagation();
	});
	
})

/**
 * 拓展layui的检验
 */
function verifyExt(form){
    //value：表单的值、domObj：表单的DOM对象
	form.verify({
        /**
		 * 验证是否为数字。true：正数、负数、整数、浮点数、0；false：其他
         */
		number: function(value){
			if(value && !/^-?[0-9]+.?[0-9]*$/.test(value))
				return '请输入数字';
	    }
        /**
		 * 验证是否为浮点数, 使用自定义属性"verify-decimal"校验规则.
		 * 1. <input type="text" lay-verify="decimal" verify-decimal="11,2"> 表示允许整数位最大为11位, 小数位最大为2位
		 * 2. <input type="text" lay-verify="decimal" verify-decimal=">11,2"> 表示允许整数位最大为11位, 小数位最大为2位, 并且value > 0
		 * 3. <input type="text" lay-verify="decimal" verify-decimal=">=11,2"> 表示允许整数位最大为11位, 小数位最大为2位, 并且value >= 0
		 * 4. <input type="text" lay-verify="decimal" verify-decimal="<11,2"> 表示允许整数位最大为11位, 小数位最大为2位, 并且value < 0
         */
        ,decimal: function(value, domObj){
			if(value){
                ///第一步：判断是否为数字
                let reulst = this.number(value);
                if(reulst){
                    return reulst;
                }
                ///第二步：判断是否满足verify-decimal
                let attr = $(domObj).attr("verify-decimal");
                if(!attr){
                    return `请对minLength检验添加verify-decimal属性`;
                }
                //从第一位开始，截取到为数字的一位
                let operator = getOperator(attr);
                //1.判断是否满足正负值约束
                if(operator){
                    let jsCode = `if(!(${new Number(value)} ${operator} 0)) reulst = "请输入 ${operator}0 的数值"`;
                    eval(jsCode);
                    if(reulst){
                        return reulst;
                    }
                }
                //2.判断是否满足长度约束
                attr = attr.substring(operator.length);
                let integerLengthVerify = attr.split(",")[0]
                    ,decimalLengthVerify = attr.split(",")[1];
                let integer = value.split(".")[0]
                    ,decimal = value.split(".")[1];
                if(integer && integer.length > Number(integerLengthVerify)){
                	return `请输入整数位数不能超过${integerLengthVerify}位, 小数位数不能超过${decimalLengthVerify}位的数值`;
				}
				if(decimal && decimal.length > Number(decimalLengthVerify)){
                    return `请输入整数位数不能超过${integerLengthVerify}位, 小数位数不能超过${decimalLengthVerify}位的数值`;
				}
			}
        }
        /**
         * 验证是否为整数, 使用自定义属性"verify-int"校验规则.
         * 1. <input type="text" lay-verify="decimal"> 表示允许所有整数，包括正整数、负整数、0
         * 2. <input type="text" lay-verify="decimal" verify-int=">"> 表示允许正整数、0
         * 3. <input type="text" lay-verify="decimal" verify-int=">="> 表示允许正整数
         * 4. <input type="text" lay-verify="decimal" verify-int="<"> 表示允许负整数
         */
		,int: function(value, domObj){
			if(value && !/^\d+$/.test(value))
				 return '请输入整数';
	    }
        /**
		 * TODO 验证范围是否合法
		 * [100, 200]表示允许范围为 大于等于100, 小于等于200的数字
         */
	    ,between: function (value, domObj) {

        }
        /**
		 * 检验输入的文本长度是否合法
         */
		,maxLength: function(value, domObj){
            let length = $(domObj).attr("verify-length");
			if(!length){
				return `请对maxLength检验添加verify-length属性`;
			}else if(!(value.length <= Number(length)) ){
				return `内容长度不能超过${length}`;
			}
	    }
        /**
         * 检验输入的文本长度是否合法
         */
		,minLength: function(value, domObj){
			let length = $(domObj).attr("verify-length");
			if(!length){
				return `请对minLength检验添加verify-length属性`;
			}else if(!(value.length >= Number(length)) ){
				return `内容长度不能小于${length}`;
			}
	    }
		,mobile: function(value, domObj){
			if(value && !/^(13[0-9]|15[012356789]|18[0123456789]|17[0123456789]|14[57])[0-9]{8}$/.test(value))
				 return '请输入正确的手机号码';
	    }
		,phone: function(value, domObj){
			if(value && !/^((0\d{2,3})-?)?(\d{7,8})(-(\d{3,}))?$/.test(value) ||/^(13[0-9]|15[0|3|6|7|8|9]|18[8|9])\d{8}$/.test(value) )
				 return '请输入正确的固话号码';
	    }
		,email: function(value, domObj){
			if(value && !/^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/.test(value))
				 return '请输入正确邮箱地址';
	    }
	});

    /**
	 * 提取自定义属性attr的操作符
     * @param value 自定义属性的值
	 * @example getOperator(">=11,9"), 返回">="; getOperator("11,9"), 返回""
     */
	function getOperator(value){
		let result = "";
        let arr = value.trim().split("");
        for(let item of arr){
        	if(isNaN(item)){
        		result += item;
			}else{
        		return result;
			}
		}
        return result;
	}
}
















